
#include "tableaudynamique.h"

void init(TableauDynamique *tb)
{
  tb->tableau = (void **) malloc (1*sizeof(void *));
  tb->capacite = 1;
  tb->utilise = 0;
}

void testament(TableauDynamique *tab, void (*detruire)(void **))
{
  int i;
  for(i = 0; i < tab->utilise; i++)
    {
      detruire(&(tab->tableau[i]));
    }
  free(tab->tableau);
  tab->capacite = 0;
  tab->utilise = 0;
}

void ajout(TableauDynamique *tab, void * el, void *(*creer)(const void *))
{
  if(tab->capacite == tab->utilise)
    {
      int i;
      /* Agrandissement du tableau par 2 */
      void **tableau = (void **) malloc ( tab->capacite * 2 * sizeof(void *));
      for(i = 0; i < tab->utilise; i++)
	{
	  tableau[i] = tab->tableau[i];
	}
      free(tab->tableau);
      tab->tableau = tableau;
      tab->capacite *= 2;
    }
  tab->tableau[tab->utilise] = creer(el);
  tab->utilise ++;
}

void * valeurIemeElementTabDyn(const TableauDynamique *t, unsigned int i)
{
  return t->tableau[i];
}

void afficheTabDyn(const TableauDynamique *t)
{
  int i;
  for(i = 0; i < t->utilise; i++)
    printf("%d ", (int)t->tableau[i]);
  printf("\n");
}

void supprimeDernierElementTabDyn(TableauDynamique *t, void (*detruire)(void **))
{
  if(t->utilise == 0)
    return;
  t->utilise --;
  detruire(&(t->tableau[t->utilise]));
  if(t->utilise <= t->capacite / 3)
    {
      /* Retrissi le tableau */
      void  **tab = (void **) malloc ( (t->capacite - t->capacite / 2) * sizeof(void *));
      int i;
      for(i = 0; i < t->utilise; i++)
	{
	  tab[i] = t->tableau[i];
	}
      free(t->tableau);
      t->tableau = tab;
      t->capacite = t->capacite - t->capacite / 2;
    }
}

void modifieValeurIemeElementTabDyn(TableauDynamique *t, void * e, unsigned int i)
{
  t->tableau[i] = e;
}
int rechercheElementTabDyn(const TableauDynamique *t, void * e)
{
  int i;
  for(i = 0; i < t->utilise; i++)
    {
      if(t->tableau[i] == e)
	return i;
    }
  return -1;
}
